package dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;

/**
 * Generic Repository, providing basic CRUD operations
 * 
 * @author Jurgen Lust
 * @author $LastChangedBy: jlust $
 * 
 * @version $LastChangedRevision: 257 $
 * 
 * @param <T>
 *            the entity type
 * @param <ID>
 *            the primary key type
 */
public interface GenericDAO<T, ID extends Serializable> {
	// ~ Methods
	// ----------------------------------------------------------------

	void refresh(T object);

	void flush();

	void clear();

	T merge(T objeto);

	void salvar(T objeto);

	void remover(T objeto);

	void removerPorChave(ID chave);

	T buscarPorChave(ID chave);

	List<T> buscarPorExemplo(T objeto, Order... ordenacoes);

	List<T> buscarPorExemplo(T objeto, Integer indiceInicial,
			Integer indiceFinal, Order... ordenacoes);

	int buscarQuantidadeTotal();

	List<T> buscarTodos(Order... ordenacoes);

	List<T> buscarTodos(Integer indiceInicial, Integer indiceFinal,
			Order... ordenacoes);

	String adicionarOrderByHql(Order... ordenacoes);

	Criteria criarCriteria();

	Example criarExemplo(T objeto);

	int buscarQuantidadeTotalAtivos();

	List<T> buscarProdutosInativos();

	List<T> buscarAtivos();
}
